function delay(func, ctx) {
    clearTimeout(func.tid)
    func.tid = setTimeout(() => {
        func.call(ctx)
    }, 100)
}

function myFunc() {
    console.dir(123)
}

// for (let i = 0; i <= 2; i++) {
//   // 这里如果是自面量，则因为每次都是新的，会不起作用
//   delay(myFunc)
// }

function delay2(func, delayTime) {
    let tid
    return function () {
        let context = this
        let args = arguments
        clearTimeout(tid)
        tid = setTimeout(() => {
            func.call(this, args)
        }, delayTime)
    }
}

let d2 = delay2(myFunc, 1000)

// d2()

function delay3(func, delay, mustRunDelay) {
    let tid
    let tStart
    return function () {
        let tCurr = new Date()
        let ctx = this
        let args = arguments
        clearTimeout(tid)
        if (!tStart) {
            tStart = tCurr
        }
        if (tCurr - tStart >= mustRunDelay) {
            func.apply(ctx, args)
            tStart = tCurr
        } else {
            tid = setTimeout(() => {
                func.apply(ctx, args)
            }, delay)
        }
    }
}

let d3 = delay3(myFunc, 100, 400)
d3()
d3()

// throttle 强制"一段时间"内函数可以调用的最大次数
// _.throttle(function, wait, [options]) function 在 wait 时间内只执行一次
// debounce 强制一段时间内函数只能被调用一次
// _.debounce(function, wait, [immediate])  function 在 wait 之后才会真正的执行
